package org.xxpay.core.common.util;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

/**
 * 国际化工具类
 * 提供便捷的国际化消息获取方法
 *
 * @author xxpay
 */
public class I18nUtil {

    // 当前语言
    private static String currentLocale = "zh_CN";

    // 消息缓存
    private static Map<String, ResourceBundle> bundleCache = new HashMap<>();

    // 支持的语言
    private static final String[] SUPPORTED_LOCALES = {"zh_CN", "en_US"};

    // 资源文件基础名称
    private static final String[] BUNDLE_NAMES = {"i18n.messages", "i18n.errors", "i18n.validation"};

    /**
     * 设置当前语言
     * @param locale 语言代码
     */
    public static void setCurrentLocale(String locale) {
        if (isSupportedLocale(locale)) {
            currentLocale = locale;
        }
    }

    /**
     * 获取国际化消息
     *
     * @param key 消息键
     * @param args 参数
     * @return 国际化消息
     */
    public static String getMessage(String key, Object... args) {
        try {
            String message = getMessageFromBundle(key);
            if (message != null && args != null && args.length > 0) {
                // 简单的参数替换
                for (int i = 0; i < args.length; i++) {
                    message = message.replace("{" + i + "}", String.valueOf(args[i]));
                }
            }
            return message != null ? message : key;
        } catch (Exception e) {
            return key;
        }
    }

    /**
     * 获取国际化消息（带默认值）
     *
     * @param key 消息键
     * @param defaultMessage 默认消息
     * @param args 参数
     * @return 国际化消息
     */
    public static String getMessage(String key, String defaultMessage, Object... args) {
        try {
            String message = getMessage(key, args);
            return message.equals(key) ? defaultMessage : message;
        } catch (Exception e) {
            return defaultMessage != null ? defaultMessage : key;
        }
    }

    /**
     * 获取指定语言的国际化消息
     *
     * @param key 消息键
     * @param locale 语言代码
     * @param args 参数
     * @return 国际化消息
     */
    public static String getMessageWithLocale(String key, String locale, Object... args) {
        try {
            String oldLocale = currentLocale;
            setCurrentLocale(locale);
            String message = getMessage(key, args);
            setCurrentLocale(oldLocale);
            return message;
        } catch (Exception e) {
            return key;
        }
    }

    /**
     * 从资源包获取消息
     *
     * @param key 消息键
     * @return 消息内容
     */
    private static String getMessageFromBundle(String key) {
        for (String bundleName : BUNDLE_NAMES) {
            try {
                ResourceBundle bundle = getResourceBundle(bundleName);
                if (bundle != null && bundle.containsKey(key)) {
                    return bundle.getString(key);
                }
            } catch (Exception e) {
                // 继续尝试下一个资源包
            }
        }
        return null;
    }

    /**
     * 获取资源包
     *
     * @param bundleName 资源包名称
     * @return 资源包
     */
    private static ResourceBundle getResourceBundle(String bundleName) {
        String cacheKey = bundleName + "_" + currentLocale;
        ResourceBundle bundle = bundleCache.get(cacheKey);

        if (bundle == null) {
            try {
                Locale locale = parseLocale(currentLocale);
                bundle = ResourceBundle.getBundle(bundleName, locale);
                bundleCache.put(cacheKey, bundle);
            } catch (Exception e) {
                // 资源包不存在或加载失败
            }
        }

        return bundle;
    }

    /**
     * 解析语言代码为Locale对象
     *
     * @param localeStr 语言代码
     * @return Locale对象
     */
    private static Locale parseLocale(String localeStr) {
        if (localeStr == null || localeStr.isEmpty()) {
            return Locale.SIMPLIFIED_CHINESE;
        }

        String[] parts = localeStr.split("_");
        if (parts.length == 2) {
            return new Locale(parts[0], parts[1]);
        } else {
            return new Locale(parts[0]);
        }
    }

    /**
     * 获取当前语言
     *
     * @return 当前语言代码
     */
    public static String getCurrentLocale() {
        return currentLocale;
    }

    /**
     * 判断是否为中文环境
     *
     * @return true-中文，false-其他
     */
    public static boolean isChinese() {
        return currentLocale != null && currentLocale.startsWith("zh");
    }

    /**
     * 判断是否为英文环境
     *
     * @return true-英文，false-其他
     */
    public static boolean isEnglish() {
        return currentLocale != null && currentLocale.startsWith("en");
    }

    /**
     * 获取语言代码
     *
     * @return 语言代码，如：zh_CN, en_US
     */
    public static String getLanguageCode() {
        return currentLocale;
    }

    /**
     * 检查语言是否支持
     *
     * @param locale 语言代码
     * @return 是否支持
     */
    public static boolean isSupportedLocale(String locale) {
        if (locale == null) return false;
        for (String supported : SUPPORTED_LOCALES) {
            if (supported.equals(locale)) {
                return true;
            }
        }
        return false;
    }
}
